PHP 5.6 - תכונות חדשות ועדכונים נוספים. התכונות החדשות כוללות ייבוא קבועים ופונקציות ממרחבי שמות, תחביר חדש עבור Variadric Functions, פריקת ארגומנטים, ביטויים סקלריים קבועים ועוד.
עבר זמן מה מאז יצאה PHP 5.4, וגרסאות חדשות החלו לצאת מהר ומהר יותר. אני מרוצה מאוד מ-PHP 5.6, והתקווה שלי בעתיד של PHP חודשה. אני אשמח לשמוע מה אתם חושבים בתגובות.
אמנם לא יהיה אפשר לכלול את כל השינויים בגרסה הזאת ולהסביר עליהם בפירוט במאמר אחד, אבל אני אעשה כמיטב יכולתי. לפירוט נוסף תוכלו לקרוא את מדריך המעבר הרשמי. תודה ל-Bruno Skvorc; נעזרתי לא מעט בעדכון "New Features in PHP 5.6" שהוא פרסם ב-SitePoint.
רשימת גרסאות PHP 5.6.0
- אלפא 1 (23.1) - תכונות חדשות
- אלפא 2 (13.2) - תכונות חדשות ותיקוני באגים
- אלפא 3 (6.3)
- בטא 1 - (11.4) - תכונות חדשות, תיקוני באגים והקפאת תכונות חדשות
- בטא 2 (2.5) - בעיקר תיקוני באגים; מעט מאוד תכונות חדשות
- בטא 3 (15.5) - תיקוני באגים בלבד
- בטא 4 (5.6)
- RC 1 (19.6)
- RC 2 (3.7)
- RC 3 (31.7)
- RC 4 (14.8)
- גרסה יציבה (28.8)
רשימת השינויים המלאה הרשמית.
ראשי פרקים: ייבוא קבועים ופונקציות ממרחבי שמות, תחביר חדש עבור Variadric Functions, פריקת ארגומנטים, ביטויים סקלריים קבועים, ספריית Zip משופרת, אופרטור חדש - חזקה, שימוש מופחת בזיכרון נתוני POST, העלאת קבצים מעל 2GB, העמסת אופרטורים פנימית, סוגי MIME בשרת ה-PHP המובנה, PHPDBG ארוז כברירת מחדל, שיפורים ב-SSL/TLS.
תכונות חדשות ב-PHP 5.6
ייבוא קבועים ופונקציות ממרחבי שמות
עד עכשיו היה אפשר לייבא רק טיפוסים (מחלקות, ממשקים ו-Traits) באמצעות האופרטור use. ב-PHP 5.6 יושם RFC שהציע לאפשר ייבוא פונקציות וקבועים, וזאת באמצעות use function ו-use const בהתאמה:
namespace Foo\Bar {
const BAZ = 42;
function qux() { echo __FUNCTION__; }
}
namespace {
use const Foo\Bar\BAZ;
use function Foo\Bar\qux;
echo BAZ."\n";
qux();
}
const BAZ = 42;
function qux() { echo __FUNCTION__; }
}
namespace {
use const Foo\Bar\BAZ;
use function Foo\Bar\qux;
echo BAZ."\n";
qux();
}
כמו ייבוא טיפוסים באמצעות use עד עכשיו, גם באמצעות use המשופר אי אפשר לייבא את כל הפונקציות או הקבועים שבמרחב שמות מסוים מבלי לציין אותם אחד-אחד.
תחביר חדש עבור Variadric Functions
Variadic Functions הן פונקציות שנועדו לקבל מספר לא קבוע של משתנים (בלי קשר לערכי ברירת מחדל). לפני PHP 5.6, כשהארגומנטים הראשונים שפונקציה כזו קיבלה היו פרמטרים קבועים והשאר היו הקבוצה עם הגודל המשתנה של ערכים, היה צריך לחתוך חלק מהמערך לאחר הקריאה לפונקציה func_get_args. הנה דוגמה לכך מה-RFC שיושם:
class MySQL implements DB {
protected $pdo;
public function query($query) {
$stmt = $this->pdo->prepare($query);
$stmt->execute(array_slice(func_get_args(), 1));
return $stmt;
}
// ...
}
$userData = $db->query('SELECT * FROM users WHERE id = ?', $userID)->fetch();
protected $pdo;
public function query($query) {
$stmt = $this->pdo->prepare($query);
$stmt->execute(array_slice(func_get_args(), 1));
return $stmt;
}
// ...
}
$userData = $db->query('SELECT * FROM users WHERE id = ?', $userID)->fetch();
עכשיו, ב-PHP 5.6, נוכל להשתמש בתחביר החדש כדי לשפר את קטע הקוד הקודם:
class MySQL implements DB {
public function query($query, ...$args) {
$stmt = $this->pdo->prepare($query);
$stmt->execute($args);
return $stmt;
}
// ...
}
public function query($query, ...$args) {
$stmt = $this->pdo->prepare($query);
$stmt->execute($args);
return $stmt;
}
// ...
}
כמו שכנראה כבר הבנתם, התחביר ...$args מורה לקבל את הארגומנטים הראשונים לפרמטרים המתאימים, ולשים את כל השאר במערך $args. זה חוסך ממנו את הקריאה ל-func_get_params() ואת חתיכת המערך, משפר את חתימות הפונקציות מהסוג הזה, ועושה את הקוד קריא יותר.
התחביר החדש מאפשר גם העברת ארגומנטים בתור הפניות (Pass by reference), באמצעות הוספת אמפרסנד לפני המשתנה, כך: &...$params. דבר זה לא היה אפשרי קודם עם func_get_args().
פריקת ארגומנטים
בעקבות יישום התחביר המשופר עבור Variadric Functions, יושם גם ה-RFC העוסק בפריקת ארגומנטים.
עד עכשיו, הדרך היחידה להעביר כמות לא ידועה מראש של ארגומנטים הייתה באמצעות call_user_func_array(). זה היה מגושם, לא נתמך בבנאים של מחלקות, ודרש Callback מטיפוס מחרוזת - שם של פונקציה - כלומר לא נתמך בעורכי קוד ברוב המקרים.
לתחביר החדש לפריקת ארגומנטים אין את כל החסרונות של הפונקציה ההיא, והוא משלים את התמיכה ב-Variadric Functions באופן טבעי.
function test(...$args) { var_dump($args); }
$args1 = [1, 2, 3];
$args2 = [4, 5, 6];
test(1, 2, 3, 4, 5, 6); // [1, 2, 3, 4, 5, 6]
test(...$args1, ...$args2); // [1, 2, 3, 4, 5, 6]
test(1, 2, 3, ...$args2); // [1, 2, 3, 4, 5, 6]
test(...$args1, 4, 5, 6); // [1, 2, 3, 4, 5, 6]
$args1 = [1, 2, 3];
$args2 = [4, 5, 6];
test(1, 2, 3, 4, 5, 6); // [1, 2, 3, 4, 5, 6]
test(...$args1, ...$args2); // [1, 2, 3, 4, 5, 6]
test(1, 2, 3, ...$args2); // [1, 2, 3, 4, 5, 6]
test(...$args1, 4, 5, 6); // [1, 2, 3, 4, 5, 6]
אפשר להשתמש בפריקת ארגומנטים בכל מצב אפשרי: בבנאי מחלקה, בפונקציות רגילות (לא רק Variadric) ומספר פעמים בקריאה אחת.
ביטויים סקלריים קבועים
יושם RFC שמאפשר לשים ביטויים סקלריים במקומות שמצפים לערכים סטטיים. זה אומר שעכשיו אפשר להשתמש באופרטורים (אריתמטיקה, לוגיקה, שרשור מחרוזות ו-Bitwise) בהגדרת קבועים, בקביעת ערכי ברירת מחדל לפרמטרים של פונקציות וכו'. יש לשים לב שמדובר רק בביטויים שמורכבים מקבועים או מערכים קבועים (מספרים ומחרוזות), ולא ממשתנים או מקריאות לפונקציות.
הנה דוגמה שנלקחה מה-RFC:
<?php
class Foo {
const BAZ = 10;
}
class Bar {
public $foo = 1 + 1;
public $bar = [
1 + 1,
1 << 2,
Foo::BAZ => "foo "."bar"
];
public $baseDir = __DIR__ . "/base";
}
class Foo {
const BAZ = 10;
}
class Bar {
public $foo = 1 + 1;
public $bar = [
1 + 1,
1 << 2,
Foo::BAZ => "foo "."bar"
];
public $baseDir = __DIR__ . "/base";
}
ספריית Zip משופרת
נוספו מתודות לספריית ה-Zip, וחלו בה עוד כמה שיפורים. אחת המתודות שבולטת במיוחד היא ZipArchive::setPassword($password), שסוף סוף מאפשרת ליצור קבצי Zip המוגנים בסיסמה.
אופרטור חדש - חזקה
באלפא 2 יושם RFC שהציע להוסיף את האופרטור ** לחישוב חזקה. על המיקום שלו בקדימות אופרטורים ועל פרטים נוספים תוכלו לקרוא ב-RFC או בדוקומנטציה, כשהיא תתעדכן. הנה דוגמה פשוטה:
echo 2 ** 4; // 16
נוסף גם אופרטור השמה מתאים (**=).
שונות
- מתודה חדשה בשם __debugInfo(), שמספקת מידע דיבאגינג נוסף על האובייקט. (אלפא 3)
- פונקציית עזר חדשה לערבול - hash_compare(). (בטא 1)
- מתודה סטטית חדשה למחלקה DateTimeImmutable בשם createFromMutable(), היוצרת אובייקט DateTimeImmutable מאובייקט DateTime רגיל (בטא 1)
שיפורים ושינויים אחרים
SSL
בכל גרסאות האלפא הוכנסו שיפורים ושינויים לכל מיני דברים הקשורים ל-SSL.
שימוש מופחת בזיכרון נתוני POST
הגדרת ה-always_populate_raw_post_data ב-php.ini, אם תופעל, תגרום לשגיאת התיישנות (Deprecated), ו-$HTTP_RAW_POST_DATA יוסר סופית באחת גרסאות ה-PHP הבאות.
זה אומר ששימוש הזיכרון של נתוני ה-POST הצטמק פי 2-3. עכשיו, כשנרצה לגשת לנתוני POST גולמיים (כמו שהם, שלא כמו ב-$_POST) נצטרך להשתמש בפתרונות אחרים, כמו זה:
$postdata = file_get_contents("php://input");
יש לשים לב שקבלת נתוני POST דרך php://input לא זמינה אם נשלח טופס בחלקים (multipart/form-data) - כלומר בעת העלאת קבצים.
העלאת קבצים מעל 2GB
עד PHP 5.6 היה אפשר להעלות רק קבצים הקטנים מ-2GB. כבר לא. :-)
העמסת אופרטורים פנימית ושיפורים בהרחבת GMP
יושם RFC שהציע ליישם העמסת אופרטורים פנימית ושיפורים אחרים בהרחבת GMP. אני לא אדון בזה בהרחבה (מי שרוצה שפשוט יקרא את ה-RFC), אבל אני אתן דוגמה אחת מה-RFC:
$result = gmp_mod(
gmp_add(
gmp_mul($c0, gmp_mul($ms0, gmp_invert($ms0, $n0))),
gmp_add(
gmp_mul($c1, gmp_mul($ms1, gmp_invert($ms1, $n1))),
gmp_mul($c2, gmp_mul($ms2, gmp_invert($ms2, $n2)))
)
),
gmp_mul($n0, gmp_mul($n1, $n2))
);
gmp_add(
gmp_mul($c0, gmp_mul($ms0, gmp_invert($ms0, $n0))),
gmp_add(
gmp_mul($c1, gmp_mul($ms1, gmp_invert($ms1, $n1))),
gmp_mul($c2, gmp_mul($ms2, gmp_invert($ms2, $n2)))
)
),
gmp_mul($n0, gmp_mul($n1, $n2))
);
$result = (
$c0 * $ms0 * gmp_invert($ms0, $n0)
+ $c1 * $ms1 * gmp_invert($ms1, $n1)
+ $c2 * $ms2 * gmp_invert($ms2, $n2)
) % ($n0 * $n1 * $n2);
$c0 * $ms0 * gmp_invert($ms0, $n0)
+ $c1 * $ms1 * gmp_invert($ms1, $n1)
+ $c2 * $ms2 * gmp_invert($ms2, $n2)
) % ($n0 * $n1 * $n2);
תגידו לי אתם מה נראה טוב יותר. :-)
סוגי MIME בשרת ה-PHP המובנה
סוגי MIME קובעים את סוג הקובץ שהשרת מחזיר ללקוח. פלט ברירת המחדל של תוכנית PHP הוא מסוג text/html, אפשר אבל להשתמש ב-Headers כדי להגדיר את את הפלט כקובץ תמונה, למשל, וליצור תמונות. כששרת מודע לסוגי ה-MIME השונים - ורוב השרתים (כגון Apache, Nginx ו-HHVM) הם כאלה - הוא יודע איך להגיש קבצים מסוגים שונים כברירת מחדל, בלי שנצטרך להגדיר הוראות מיוחדות ב-PHP. לשרת שורת הפקודה מ-PHP 5.4 היו רק סוגי MIME מעטים עד עכשיו, והגרסה הזאת תוסיף לו עוד עשרות. בטוח לומר ששרת ה-PHP המובנה יוכל לטפל בכל סוגי ה-MIME השכיחים.
PHPDBG ארוז כברירת מחדל
phpdbg, הדיבאגר דמוי ה-gdb, ארוז כברירת מחדל כ-SAPI (כלומר API שרת - ממשק התקשורת בין מנוע ה-PHP/Zend ל"עולם החיצוני"). משתמשים בו משורת הפקודה או באמצעות ממשק משתמש פשטני מבוסס Java. אפשר להגדיר באמצעותו נקודות שבירה (Break Points), לשנות את התוכנה בזמן ריצה ועוד. הוא יכול גם לפקח על Opcode ואפשר להשתמש בו גם בתוך תוכנית PHP.
ועוד
אין כאן מקום לכל השינויים ולפירוט על כל דבר. אתם מוזמנים לבדוק את רשימת השינויים הרשמית ולקרוא עוד במדריך המעבר הרשמי. שימו לב שיש כמה שינויים שאינם תואמים עם קוד של גרסאות קודמות.
תגובות לכתבה:
אלפא3 יצא בבקשה עדכן.
@yonikal56 אין יותר מדי מה להוסיף על אלפא 3 (אם כי סוף סוף הוסיפו כמה דברים מסוימים). אני אעדכן לאחר שתצא הבטא הראשונה (שהייתה אמורה לצאת כבר לפני שלושה שבועות, אם כבר מדברים על זה).
סוף סוף יצאה גרסת הבטא הראשונה! :-)
*עדכון:* יצאה הבטא השנייה. יש בה בעיקר תיקוני באגים, אך גם שתי תכונות חדשות - אחת ל-phpdbg והשנייה ל-mysqlnd. אם זה אומר לכם משהו, לכו לרשימת השינויים הרשמית: https://github.com/php/php-src/blob/php-5.6.0beta2/NEWS
זהו, יצאה PHP 5.6.